/*MyPhotoIndex Free Photo Organizer <www.myphotoindex.com>
  Copyright (C) <2006-2009>  <Asaf Yarkoni asaf@yarkoni.net>

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
using System;
using System.Collections.Generic;
using System.Text;
using MyPhotoIndex.Interfaces.Imaging;
using System.Collections.ObjectModel;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace MyPhotoIndex.Importer
{
    public class ImageMetadataExporter
    {
        private ReadOnlyCollection<IImageData> m_images;
        private string m_indexId;

        public ImageMetadataExporter(ReadOnlyCollection<IImageData> images, string indexId)
        {
            m_images = images;
            m_indexId = indexId;
        }

        public void Export(XmlWriter writer, bool exportTags)
        {
            writer.WriteStartElement("MyPhotoIndexImageData");          
            writer.WriteStartElement("ExportData");
            writer.WriteStartElement("sourceIndexId");
            writer.WriteValue(m_indexId);
            writer.WriteEndElement();
            writer.WriteEndElement();

            if (exportTags == true)
            {
                Dictionary<int, int> tags = new Dictionary<int, int>();
                foreach (IImageData imageData in m_images)
                {
                    foreach (int tagId in imageData.Tags)
                    {
                        if (tags.ContainsKey(tagId) == false)
                        {
                            tags.Add(tagId, tagId);
                        }
                    }
                }

                int[] tagIds = new int[tags.Count];
                tags.Keys.CopyTo(tagIds, 0);

                TagsDataExporter tagsExporter = new TagsDataExporter(tagIds);
                tagsExporter.Export(writer);
            }

            writer.WriteStartElement("Images");

            foreach (IImageData imageData in m_images)
            {
                ExportOneImageMetadata(writer, imageData);
            }

            writer.WriteEndElement();
            writer.WriteEndElement();
        }

        private void ExportOneImageMetadata(XmlWriter writer, IImageData imageData)
        {
            XmlSerializer serializer = new XmlSerializer(imageData.GetType());
            using(MemoryStream ms = new MemoryStream())
            {
                XmlWriter tempWriter = new XmlTextWriter(ms, Encoding.Unicode);
                serializer.Serialize(tempWriter, imageData);
                ms.Position = 0;
                XmlTextReader reader = new XmlTextReader(ms);
                reader.MoveToContent();
                string data = reader.ReadOuterXml();
                writer.WriteRaw(data);
            }
        }
    }
}
